package com.server.common;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class AutoCodeGenerate {

    // 旧的代码生成器(无Lombok自动引入)
    public static void create() {
        try{

            AutoGenerator autoGenerator = new AutoGenerator();
            // 设置数据源
            DataSourceConfig dataSource = new DataSourceConfig();
            dataSource.setDriverName("com.mysql.cj.jdbc.Driver");
            dataSource.setUrl("jdbc:mysql://26.61.241.90:3306/water?characterEncoding=utf-8&serverTimezone=UTC");
            dataSource.setUsername("root");
            dataSource.setPassword("1234");
            autoGenerator.setDataSource(dataSource);

            // 设置全局配置（注意在 com.xx.GeneratorConstructor运行）
            GlobalConfig globalConfig = new GlobalConfig();
            globalConfig.setOutputDir(System.getProperty("user.dir")+"/../WEEM/src/main/java");
            globalConfig.setOpen(false);
            globalConfig.setAuthor("wzw");
            globalConfig.setFileOverride(true);
            globalConfig.setMapperName("%sMapper");      // 接口名称
            globalConfig.setIdType(IdType.AUTO);
            autoGenerator.setGlobalConfig(globalConfig);

            // 设置包名相关配置
            PackageConfig packageInfo = new PackageConfig();
            packageInfo.setParent("com.server");
            packageInfo.setEntity("entity");  // 或者domain
            packageInfo.setMapper("mapper");  // 或者dao
            autoGenerator.setPackageInfo(packageInfo);

//       // 策略配置
//       StrategyConfig strategyConfig = new StrategyConfig();
//       //        StrategyConfig.setInclude("tb1_user");   // 仅仅包含
//       //        StrategyConfig.setTablePrefix("tb1_");
//       //        StrategyConfig.setVersionFieldName("version");  // 乐观锁字段
//       strategyConfig.setRestControllerStyle(true);
//       strategyConfig.setLogicDeleteFieldName("is_delete");
//       strategyConfig.setEntityLombokModel(true);
//       autoGenerator.setStrategy(strategyConfig);

            // 执行生成操作
            autoGenerator.execute();
        }catch (Exception e){
            System.out.println("创建文件出现异常"+e.getMessage());
        }
    }

    // 新的代码生成器(有Lombok自动引入)
    public static void createLombok(){
        try{
            //1. 全局配置
            GlobalConfig config = new GlobalConfig();
            // 是否支持AR模式
            config.setActiveRecord(true)
                    // 作者
                    .setAuthor("wzw")
                    // 生成路径，最好使用绝对路径，window路径是不一样的 这里方便自己粘贴复制 所以不直接生成在项目文件
                    .setOutputDir(System.getProperty("user.dir")+"/../WEEM/src/main/java/com")
                    // 是否打开资源管理器
                    .setOpen(false)
                    // 文件覆盖(不建议覆盖)
                    .setFileOverride(false)
                    // 主键策略
                    .setIdType(IdType.AUTO)
                    // 日期类型
                    .setDateType(DateType.ONLY_DATE)
                    // 设置生成的service接口的名字的首字母是否为I，默认Service是以I开头的
                    .setServiceName("%sService")
                    //实体类结尾名称
                    .setEntityName("%s")
                    //控制器结尾名称（转换成驼峰习惯命名）
                    .setControllerName("%s")
                    //生成基本的resultMap
                    .setBaseResultMap(true)
                    //不使用AR模式
                    .setActiveRecord(false)
                    //生成基本的SQL片段
                    .setBaseColumnList(false);

            //2. 数据源配置
            DataSourceConfig dsConfig = new DataSourceConfig();
            // 设置数据库类型
            dsConfig.setDbType(DbType.MYSQL)
                    .setDriverName("com.mysql.cj.jdbc.Driver")
                    .setUrl("jdbc:mysql://26.61.241.90:3306/water?characterEncoding=utf-8&serverTimezone=UTC")
                    .setUsername("root")
                    .setPassword("1234");

            //3. 策略配置globalConfiguration中
            StrategyConfig stConfig = new StrategyConfig();
            //全局大写命名
            stConfig.setCapitalMode(true)
                    // 数据库表映射到实体的命名策略
                    .setNaming(NamingStrategy.underline_to_camel)
                    //使用lombok
                    .setEntityLombokModel(true)
                    //使用restcontroller注解
                    .setRestControllerStyle(true);
                    // 生成的表, 支持多表一起生成，以数组形式填写
                    //.setInclude("user","address");

            //4. 包名策略配置
            PackageConfig pkConfig = new PackageConfig();
            pkConfig.setParent("com.server")
                    .setService("service")
                    .setServiceImpl("service.impl")
                    .setController("controller")
                    // 生成的Service和Controller放置在null文件夹，删除文件夹即可。
//                    .setService("removeFiles")
//                    .setServiceImpl("removeFiles")
//                    .setController("removeFiles")
                    .setEntity("entity")
                    .setMapper("mapper")
                    .setXml("mapper.xml");

            //5. 整合配置
            AutoGenerator ag = new AutoGenerator();
            ag.setGlobalConfig(config)
                    .setDataSource(dsConfig)
                    .setStrategy(stConfig)
                    .setPackageInfo(pkConfig);

            //6. 执行操作
            ag.execute();
            System.out.println("=======Done 相关代码生成完毕  ========");

            //7.删除不需要的文件
            removeFiles();

            // 8.将数据类型转换
            // BigDecimal => Double
            // 9.mapper添加注解(略)
            // @Mapper
            // 11.迁移xml位置
            // 将xml迁移至resources目录下
        }catch (Exception e){
            System.out.println("出现异常"+e.getMessage());
        }
    }

    // 删除不需要的文件
    public static void removeFiles(){
        try {
            String path = System.getProperty("user.dir")+"\\src\\main\\java\\com\\server";
            // 调用CMD命令
            ProcessBuilder processBuilder = new ProcessBuilder("cmd.exe", "/c", "rmdir /s /q " + path + "\\removeFiles"); // /c参数表示执行后关闭CMD窗口
            processBuilder.redirectErrorStream(true); // 将错误输出流与标准输出流合并
            Process process = processBuilder.start();

            // 获取命令输出结果
            InputStream inputStream = process.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "GBK")); // 设置编码为GBK
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }

            // 等待命令执行完成
            process.waitFor();
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}